package communicationTCP;


import java.io.*;
import java.net.*;

import protocol.*;

/**
 * Client TCP permettant la communication avec un serveur
 * Se connecte à un serveur
 * Envoie des requêtes et reception des réponses
 * 
 * @author Alexandre BOURSIER, Nolan Potier
 * 
 */
public class Client_TCP {
	private Socket socket; // le socket client
	private ObjectOutputStream os; // output stream
	private ObjectInputStream is; // input stream
	
	public Client_TCP() {
		try {
			System.out.println("connexion au serveur");
			socket = new Socket("157.169.103.73", 1025);
			os = new ObjectOutputStream(socket.getOutputStream());
			is = new ObjectInputStream(socket.getInputStream());
		} catch (UnknownHostException e) {
			System.err.println("Don't know about host: hostname");
		} catch (IOException e) {
			System.err
					.println("Couldn't get I/O for the connection to: hostname");
		}
		if (socket != null && os != null && is != null) {
			System.out.println("Connexion reussie");
		} else {
			System.out.println("Connexion échouée");
		}
	}
	
	/**
	 * Envoyer une requête pour ajouter un surnom
	 * @param surnom
	 * 			le surnom à ajouter
	 * @param nom
	 * 			le nom cible
	 */
	public void ajouter(String surnom, String nom) {
		Add add1 = new Add(surnom, nom);
		try {
			os.writeObject(add1);
			Answer rep;
			rep = (Answer) is.readObject();
			System.out.println(rep.getFeedback());
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * Envoyer une requête pour obtenir la list des surnom
	 */
	public void lister() {
		protocol.List list = new protocol.List();
		try {
			os.writeObject(list);
			Answer rep;
			rep = (Answer) is.readObject();
			System.out.println(rep.getFeedback());
			System.out.println(rep.getResults().toString());
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	/**
	 * Envoyer une requête pour obtenir la liste des surnom d'un nom.
	 * @param nom
	 * 			le nom cible
	 */
	public void lister(String nom) {
		protocol.List list = new protocol.List(nom);
		try {
			os.writeObject(list);
			Answer rep;
			rep = (Answer) is.readObject();
			System.out.println(rep.getFeedback());
			System.out.println(rep.getResults().toString());
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	/**
	 * Envoyer une requête pour fermer la connexion avec le serveur
	 */
	public void quitter() {
		try {
			// Fermer le serveur
			os.writeObject(new Request (Type.EXIT));

			// Fermer tous les flux
			os.close();
			is.close();
			socket.close();
			System.out.println("Fermeture connexion");
		} catch (IOException e) {
			System.err
					.println("Erreur lors de la fermeture de la connexion avec le serveur");
		}
	}

	public static void main(String[] args) {
		Client_TCP client = new Client_TCP();
		client.ajouter("nolan", "papa");
		client.ajouter("nolan", "nolspot");
		client.ajouter("alex", "bourse");
		client.ajouter("nathan", "sliptaché");

		client.lister();
		client.lister("nolan");
		client.lister("nathan");
		client.lister("slip");

		client.quitter();
	}
}